# -*- coding: utf-8 -*-
import hashlib
import requests
import json
from enum import Enum


class Order(Enum):
    ASC = "asc",
    DESC = "desc"


class Func:
    def __init__(self, hezi_ip, hezi_port, user_name, user_password):
        self.ip = hezi_ip
        self.port = hezi_port
        self.user_name = user_name
        self.user_password = user_password
        self.latest_token = None

    def md5_encryption(self, src):
        m2 = hashlib.md5()
        m2.update(src.encode("utf8"))
        return m2.hexdigest()

    # 获取token
    def get_token(self):
        try:
            url = "http://{}:{}/authentication/v1/token".format(self.ip, self.port)
            payload = {
                "audience": "web",
                "subject": "token",
                "username": self.user_name,
                "password": self.md5_encryption(self.user_password)
            }
            headers = {
                'Content-Type': 'application/json'
            }

            response = requests.request("POST", url, headers=headers, data=json.dumps(payload))
            if not response.ok:
                print("Get token failed\nStatus:", response.status_code)
                message = response.reason
            else:
                response_json = response.json()
                self.latest_token = response_json.get("token")
                message = self.latest_token
            result = {'status': response.status_code, 'message': message}
        except Exception as e:
            result = {'status': 500, 'message': str(e)}
        return result

    # 获取人像列表
    def get_repo_all(self):
        try:
            url = "http://{}:{}/face/v1/repositories".format(self.ip, self.port)
            headers = {
                "token": self.latest_token,
                'Content-Type': 'application/json',
                'Accept': 'application/json'
            }
            response = requests.request("GET", url, headers=headers)
            if not response.ok and response.status_code != 401:
                print("Get repo all failed\nStatus:", response.status_code)
                message = response.reason
            # token 过期
            elif response.status_code == 401:
                token_back = self.get_token()
                if token_back.get("status") != 200:
                    raise Exception(token_back.get("message"))
                return self.get_repo_all()
            else:
                response_json = response.json()
                message = response_json.get("repository_list")
            result = {'status': response.status_code, 'message': message}
        except Exception as e:
            result = {'status': 500, 'message': str(e)}
        return result

    # 创建 & 编辑人像库信息
    def create_repo(self, repo_id: int, name: str = None):
        try:
            if name is None:
                name = "Repo_" + str(repo_id)
            url = "http://{}:{}/face/v1/repositories/{}".format(self.ip, self.port, repo_id)
            headers = {
                "token": self.latest_token,
                'Content-Type': 'application/json',
                'Accept': 'application/json'
            }
            payload = {
                "extra_meta": "",
                "face_number": 0,
                "name": name
            }
            response = requests.request("PUT", url, headers=headers, data=json.dumps(payload))
            if not response.ok and response.status_code != 401:
                print("Create repo failed\nStatus:", response.status_code)
                message = response.reason
            # token 过期
            elif response.status_code == 401:
                token_back = self.get_token()
                if token_back.get("status") != 200:
                    raise Exception(token_back.get("message"))
                return self.create_repo(repo_id)
            else:
                message = {"name": name}
            result = {'status': response.status_code, 'message': message}
        except Exception as e:
            result = {'status': 500, 'message': str(e)}
        return result

    # 删除人像库
    def delete_repo(self, repo_id):
        try:
            url = "http://{}:{}/face/v1/repositories/{}".format(self.ip, self.port, repo_id)
            headers = {
                "token": self.latest_token,
                'Content-Type': 'application/json',
                'Accept': 'application/json'
            }
            response = requests.request("DELETE", url, headers=headers, data=json.dumps(True))
            if not response.ok and response.status_code != 401:
                print("Delete repo failed\nStatus:", response.status_code)
                message = response.reason
            # token 过期
            elif response.status_code == 401:
                token_back = self.get_token()
                if token_back.get("status") != 200:
                    raise Exception(token_back.get("message"))
                return self.delete_repo(repo_id)
            else:
                message = "success"
            result = {'status': response.status_code, 'message': message}
        except Exception as e:
            result = {'status': 500, 'message': str(e)}
        return result

    # 插入图片 image:图片的base64 字符串
    def insert_image(self, repo_id: int, hezi_face_id: int, image: str, face_id: str, name: str = None,
                     person_id: str = None):
        try:
            if name is not None:
                pic_name = name
            else:
                pic_name = face_id
            extra_data = {"name": pic_name}
            if person_id:
                extra_data.update({"id": person_id})

            extra_data.update({"face_id": face_id})

            url = "http://{}:{}/face/v1/repositories/{}/faces/{}".format(self.ip, self.port, repo_id, hezi_face_id)
            headers = {
                "token": self.latest_token,
                'Content-Type': 'application/json',
                'Accept': 'application/json'
            }
            payload = {
                "face_image": {
                    "content_type": "jpeg",
                    "content": str(image)
                },
                "extra_meta": json.dumps(extra_data)
            }
            response = requests.request("POST", url, headers=headers, data=json.dumps(payload))
            # token 过期
            if response.status_code == 401:
                token_back = self.get_token()
                if token_back.get("status") != 200:
                    raise Exception(token_back.get("message"))
                return self.insert_image(repo_id, hezi_face_id, image, face_id)
            elif response.status_code == 400:
                message = response.json().get("message")
            elif not response.ok:
                print("Insert face failed\nStatus:", response.status_code)
                message = response.reason
            else:
                message = "success"
            result = {'status': response.status_code, 'message': message}
        except Exception as e:
            result = {'status': 500, 'message': str(e)}
        return result

    # 插入图片 feature 字符串
    def insert_feature(self, repo_id, hezi_face_id, feature: str, face_id: str, name=None, person_id=None):
        try:
            if name is not None:
                pic_name = name
            else:
                pic_name = face_id

            extra_data = {"name": pic_name}
            if person_id:
                extra_data.update({"id": person_id})

            extra_data.update({"face_id": face_id})

            url = "http://{}:{}/face/v1/repositories/{}/faces/{}".format(self.ip, self.port, repo_id, hezi_face_id)
            headers = {
                "token": self.latest_token,
                'Content-Type': 'application/json',
                'Accept': 'application/json'
            }
            payload = {
                "face_image": str(feature),
                "extra_meta": json.dumps(extra_data)
            }

            response = requests.request("POST", url, headers=headers, data=json.dumps(payload))
            # token 过期
            if response.status_code == 401:
                token_back = self.get_token()
                if token_back.get("status") != 200:
                    raise Exception(token_back.get("message"))
                return self.insert_feature(repo_id, hezi_face_id, feature, face_id)
            elif response.status_code == 400:
                message = response.json().get("message")
            elif not response.ok:
                print("Insert face failed\nStatus:", response.status_code)
                message = response.reason
            else:
                message = "success"
            result = {'status': response.status_code, 'message': message}
        except Exception as e:
            result = {'status': 500, 'message': str(e)}
        return result

    # 插入图片 feature 字符串   --- 更新静态库
    def insert_feature_put(self, repo_id, hezi_face_id, feature: str, face_id: str, name=None, person_id=None):
        try:
            if name is not None:
                pic_name = name
            else:
                pic_name = face_id
            extra_data = {"name": pic_name}
            if person_id:
                extra_data.update({"id": person_id})

            extra_data.update({"face_id": face_id})

            url = "http://{}:{}/face/v1/repositories/{}/faces/{}".format(self.ip, self.port, repo_id, hezi_face_id)
            headers = {
                "token": self.latest_token,
                'Content-Type': 'application/json',
                'Accept': 'application/json'
            }
            payload = {
                "face_image": str(feature),
                "extra_meta": json.dumps(extra_data)
            }

            response = requests.request("PUT", url, headers=headers, data=json.dumps(payload))
            # token 过期
            if response.status_code == 401:
                token_back = self.get_token()
                if token_back.get("status") != 200:
                    raise Exception(token_back.get("message"))
                return self.insert_feature_put(repo_id, hezi_face_id, feature, face_id)
            elif response.status_code == 400:
                message = response.json().get("message")
            elif not response.ok:
                print("Update face failed\nStatus:", response.status_code)
                message = response.reason
            else:
                message = "success"
            result = {'status': response.status_code, 'message': message}
        except Exception as e:
            result = {'status': 500, 'message': str(e)}
        return result

    # 删除图片
    def delete_face(self, repo_id, face_id):
        try:
            url = "http://{}:{}/face/v1/repositories/{}/faces/{}".format(self.ip, self.port, repo_id, face_id)
            headers = {
                "token": self.latest_token,
                'Content-Type': 'application/json',
                'Accept': 'application/json'
            }
            response = requests.request("DELETE", url, headers=headers, data=json.dumps(True))
            if not response.ok and response.status_code != 401:
                print("Delete face failed\nStatus:", response.status_code)
                message = response.reason
            # token 过期
            elif response.status_code == 401:
                token_back = self.get_token()
                if token_back.get("status") != 200:
                    raise Exception(token_back.get("message"))
                return self.delete_face(repo_id, face_id)
            else:
                message = "success"
            result = {'status': response.status_code, 'message': message}
        except Exception as e:
            result = {'status': 500, 'message': str(e)}
        return result

    # 根据人脸id获取图片
    def get_face_one(self, repo_id, face_id):
        try:
            url = "http://{}:{}/face/v1/repositories/{}/faces/{}".format(self.ip, self.port, repo_id, face_id)
            headers = {
                "token": self.latest_token,
                'Content-Type': 'application/json',
                'Accept': 'application/json'
            }
            response = requests.request("GET", url, headers=headers)
            if not response.ok and response.status_code != 401:
                print("Get face one failed\nStatus:", response.status_code)
                message = response.reason
            # token 过期
            elif response.status_code == 401:
                token_back = self.get_token()
                if token_back.get("status") != 200:
                    raise Exception(token_back.get("message"))
                return self.get_face_one(repo_id, face_id)
            else:
                message = response.json().get("feature")
            result = {'status': response.status_code, 'message': message}
        except Exception as e:
            result = {'status': 500, 'message': str(e)}
        return result

    # 以图搜图 1vN
    def one_than_n(self, image, threshold, repositories: list, topk=30):
        ...
        try:
            _url = "http://{}:{}/face/v1/repositories/face_one_vs_n".format(self.ip, self.port)
            headers = {
                "token": self.latest_token,
                'Content-Type': 'application/json',
                'Accept': 'application/json'
            }
            payload = {
                "repositories":
                    repositories,
                "face_image": {
                    "content_type": "jpeg",
                    "content": image
                },
                "threshold": threshold,
                "topk": topk
            }
            response = requests.request("PUT", _url, headers=headers, data=json.dumps(payload))
            # token 过期
            if response.status_code == 401:
                token_back = self.get_token()
                if token_back.get("status") != 200:
                    raise Exception(token_back.get("message"))
                return self.one_than_n(image, threshold, repositories, topk)
            elif response.status_code == 400:
                message = response.json().get("message")
            elif not response.ok:
                print("Ovn failed\nStatus:", response.status_code)
                message = response.reason
            else:
                message = response.json()
            result = {'status': response.status_code, 'message': message}
        except Exception as e:
            result = {'status': 500, 'message': str(e)}
        return result

    # 以图搜图 1vN
    def one_than_n_feature(self, feature: str, threshold, repositories: list, topk=30):
        ...
        try:
            _url = "http://{}:{}/face/v1/repositories/face_one_vs_n".format(self.ip, self.port)
            headers = {
                "token": self.latest_token,
                'Content-Type': 'application/json',
                'Accept': 'application/json'
            }
            payload = {
                "repositories":
                    repositories,
                "face_image": feature,
                "threshold": threshold,
                "topk": topk
            }
            response = requests.request("PUT", _url, headers=headers, data=json.dumps(payload))
            # token 过期
            if response.status_code == 401:
                token_back = self.get_token()
                if token_back.get("status") != 200:
                    raise Exception(token_back.get("message"))
                return self.one_than_n_feature(feature, threshold, repositories, topk)
            elif response.status_code == 400:
                message = response.json().get("message")
            elif not response.ok:
                print("Ovn failed\nStatus:", response.status_code)
                message = response.reason
            else:
                message = response.json()
            result = {'status': response.status_code, 'message': message}
        except Exception as e:
            result = {'status': 500, 'message': str(e)}
        return result

    # 拉取抓拍/比对记录
    def get_records_capture(self, limit: int = None, start_id: int = None, order: Order = Order.DESC.value,
                            **kwargs):
        url = "http://{}:{}/face/v1/records?mode=capture&order={}".format(self.ip, self.port, order)
        if limit is not None:
            url += "&limit={}".format(limit)
        if start_id is not None:
            url += "&start_id={}".format(start_id)
        for k, v in kwargs.items():
            url += "&{}={}".format(k, v)
        headers = {
            "token": self.latest_token,
            'Content-Type': 'application/json',
            'Accept': 'application/json'
        }
        try:
            response = requests.request("GET", url, headers=headers)
            if not response.ok and response.status_code != 401:
                print("Get records failed\nStatus:", response.status_code)
                message = response.reason
            # token 过期
            elif response.status_code == 401:
                token_back = self.get_token()
                if token_back.get("status") != 200:
                    raise Exception(token_back.get("message"))
                return self.get_records_capture(limit, start_id, order, **kwargs)
            else:
                message = response.json().get("records")
            result = {'status': response.status_code, 'message': message}
        except Exception as e:
            result = {'status': 500, 'message': str(e)}
        return result


# print(get_records_capture("192.168.1.234", 80, limit=1))
# client = Func("192.168.1.234", 80, "admin", "yitutech123")
# 创建人像库
# print(client.create_repo(9999))
# 查询人想库列表
# print(get_repo_all("192.168.1.233",80))
# 获取token
# print(get_token("192.168.1.233",80))
# 插入人像库图片 无feature
# print(insert_image("192.168.1.233", 80, 10000, 1235,
#                    "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",
#                    name='name123', person_id='100122'))
# # 有 feature

# print(client.insert_feature_put(9999, 1234,
#                             "i1pPDPe9fj8yjESVlbsbty3hBTHXC+lDewS3gZZROjO+o4I4tfTLSq5jLrEgLFKFsPzPBOv4vhpQyd5wZ0wL6brAkpp/FKA5t7EecABuo/U2cCrim3R/5vvWNQbnlnSV6I5xapI+ETxP0rjQ2kGJaSSv4YNmBKudvXzrRpWaMLaQlf2vdKs0dcbUPugnK5jEmG2yOV0n1BrsUlOW9LnC9cDQywpvs5Qjn/Zfj/wBoJ83fLZtyyM1m62DJ6RCOBSalRAd/7JGWl/mIQWJ+BjijojiWoblBiuWKQoPLSFJz+IOkDfevq6iSjIBFQkjjgRi14uUUFKgJDj43kzAoL83ng==",
#                             face_id="1234", name='name1234', person_id='100123'))
# ebn 无feature
# print(client.one_than_n("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",
#                  97, [1, 2], topk=30))
# 删除人像库
# print(delete_repo("192.168.1.233", 80, 10000))
# 删除证件照
# print(delete_face("192.168.1.233", 80, 2, 468))
